package br.unicamp.ic.inf300.arena.modelo.logistico;
/**
 * Venda de Bilhetes Eletronicos para Espetaculos (Arena Entretenimento S.A.)
 * Evento.java
 */

import java.sql.Date;
import java.sql.Time;

import br.unicamp.ic.inf300.arena.modelo.artistico.Espetaculo;
import br.unicamp.ic.inf300.arena.modelo.financeiro.ContaContabil;
import br.unicamp.ic.inf300.framework.util.DataUtil;

public class Evento {

	private long codEvento;
	
	private Time horarioSessao;
	
	private Date data;

	private int qtdVagasLivre;

	private double valor;

	private Espetaculo espetaculo;

	private Sala sala;

	private AgendaArtistica agenda;

	public Evento() {
		super();
	}
	
	/**
	 * 
	 * @param codEvento
	 * @param horarioSessao
	 * @param qtdVagasLivre
	 * @param valor
	 * @param espetaculo
	 * @param sala
	 * @param agenda
	 */
	public Evento(long codEvento, Time horarioSessao, int qtdVagasLivre,
			double valor, Espetaculo espetaculo, Sala sala,
			AgendaArtistica agenda) {
		super();
		this.codEvento = codEvento;
		this.horarioSessao = horarioSessao;
		this.qtdVagasLivre = qtdVagasLivre;
		this.valor = valor;
		this.espetaculo = espetaculo;
		this.sala = sala;
		this.agenda = agenda;
	}

	/**
	 * Ha pelo menos uma vaga disponivel?
	 * 
	 * @return boolean
	 */
	public boolean haVagaLivre() {
		return (this.qtdVagasLivre > 0 ? true : false);
	}

	/**
	 * Ha qtd informada de vagas disponiveis?
	 * 
	 * @param qtd
	 * @return boolean
	 */
	public boolean haVagaLivre(int qtd) {
		return (this.qtdVagasLivre >= qtd ? true : false);
	}
	
	/**
	 *  Incrementa vagas livres conforme param. qtd representando reservas canceladas. 
	 * 
	 * @param qtd
	 */
	public void cancelarReservas(int qtd) {
		this.qtdVagasLivre = this.qtdVagasLivre + qtd; 
	}

	public Espetaculo getEspetaculo() {
		return espetaculo;
	}

	public void setEspetaculo(Espetaculo espetaculo) {
		this.espetaculo = espetaculo;
	}
	
	public String getHorarioSessaoView() {
		return horarioSessao != null ? DataUtil.formatarData(DataUtil.TIME, horarioSessao) : "";
	}

	public Time getHorarioSessao() {
		return horarioSessao;
	}

	public void setHorarioSessao(Time horarioSessao) {
		this.horarioSessao = horarioSessao;
	}

	public int getQtdVagasLivre() {
		return qtdVagasLivre;
	}

	public void setQtdVagasLivre(int qtdVagasLivre) {
		this.qtdVagasLivre = qtdVagasLivre;
	}

	public Sala getSala() {
		return sala;
	}

	public ContaContabil getContaContabil() {
		return sala.getUnidadeNegocio().getContaContabil();
	}

	public void setSala(Sala sala) {
		this.sala = sala;
	}

	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	public long getCodEvento() {
		return codEvento;
	}

	public void setCodEvento(long codEvento) {
		this.codEvento = codEvento;
	}

	public AgendaArtistica getAgenda() {
		return agenda;
	}

	public void setAgenda(AgendaArtistica agenda) {
		this.agenda = agenda;
	}
	
	public String getDataView() {
		return data != null ? DataUtil.formatarData(DataUtil.DATE, data) : "";
	}
	
	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	/**
	 * @return <code>String</code>
	 * JUtils plugin ;-)
	 */
	public String toString()
	{
	    final String TAB = "    ";
	    
	    StringBuffer retValue = new StringBuffer();
	    
	    retValue.append("Evento ( ")
	        .append(super.toString()).append(TAB)
	        .append("agenda = ").append(this.agenda).append(TAB)
	        .append("codEvento = ").append(this.codEvento).append(TAB)
	        .append("data = ").append(this.data).append(TAB)
	        .append("espetaculo = ").append(this.espetaculo).append(TAB)
	        .append("horarioSessao = ").append(this.horarioSessao).append(TAB)
	        .append("qtdVagasLivre = ").append(this.qtdVagasLivre).append(TAB)
	        .append("sala = ").append(this.sala).append(TAB)
	        .append("valor = ").append(this.valor).append(TAB)
	        .append(" )");
	    
	    return retValue.toString();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((agenda == null) ? 0 : agenda.hashCode());
		result = prime * result + (int) (codEvento ^ (codEvento >>> 32));
		result = prime * result
				+ ((espetaculo == null) ? 0 : espetaculo.hashCode());
		result = prime * result + ((sala == null) ? 0 : sala.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Evento other = (Evento) obj;
		if (agenda == null) {
			if (other.agenda != null)
				return false;
		} else if (!agenda.equals(other.agenda))
			return false;
		if (codEvento != other.codEvento)
			return false;
		if (espetaculo == null) {
			if (other.espetaculo != null)
				return false;
		} else if (!espetaculo.equals(other.espetaculo))
			return false;
		if (sala == null) {
			if (other.sala != null)
				return false;
		} else if (!sala.equals(other.sala))
			return false;
		return true;
	}

}